package ventas;
/**
 * esta clase representa los test de las ventas
 * con envio pagado;
 */


import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.verify;

import org.junit.Before;
import org.junit.Test;

import sucursal.Stock;
import ventas.VentaConEnvioYaPagado;
import exceptions.VentaYaAbonadaException;
import exceptions.VentasException;

/**
 * @author Lucas Alan Silvestri
 *
 */
public class VentaConEnvioPagadoTest extends VentaConEnvioTest {

	
	@Before
	public void setUp() throws Exception {
		super.setUp();
		this.setSut(new VentaConEnvioYaPagado(
				this.getListaDeComprasDelCliente(),
				this.getSucursalDeLACompra(),
				this.getClienteQueRealizaLaCompra()));
	}

	/**
	 * Este test demuestra la capacidad de realizar una compra con exito.
	 * @throws VentaYaAbonadaException
	 */
	@Override
	@Test
	public void realizarCompraTest() throws VentasException {
		assertEquals(5, this.getSut().numeroDeProductosAComprar());
		assertEquals(0, this.getSut().numeroDeProductosComprados());
		this.getSut().realizarCompra();
		assertEquals(0, this.getSut().numeroDeProductosAComprar());
		assertEquals(5, this.getSut().numeroDeProductosComprados());
	}
	
	/**
	 * este test espera que se lanze la excepcion
	 *  "VentaYaAbonadaException".
	 * 
	 * @throws VentaYaAbonadaException
	 */
	@Override
	@Test(expected = VentaYaAbonadaException.class)
	public void elClienteNoPuedePagarTest() throws VentaYaAbonadaException {
		this.getSut().elClientePuedePagarLosProductos();
	}
	
	/**
	* este test espera que se lanze la excepcion
	 *  "VentaYaAbonadaException".
	 * 
	 * @throws VentaYaAbonadaException
	 */
	@Override
	@Test(expected = VentaYaAbonadaException.class)
	public void elClientePuedePagarTest() throws VentaYaAbonadaException {
		this.getSut().elClientePuedePagarLosProductos();
	}
	
	/**
	 * Este test verifica que se haya creado un ticket con el monto apropiado
	 * por la compra.
	 * 
	 * @throws VentasException
	 */
	@Override
	@Test
	public void ticketApropiadoTest() throws VentasException {
		this.getSut().realizarCompra();
		assertEquals(0, this.getSut().getTicketDeVenta().getPrecio(), 0.002F);
	}
	
	/**
	 * este test demuestra que existia una oferta y que se aplico de forma
	 * efectiva al monto que debe pagar el cliente.
	 */
	@Override
	@Test
	public void montoAPagarConDescuentoTest() {
		assertEquals(0, this.getSut().montoAPagarConDescuentosAplicados(), 0.002);
	}
	
	/**
	 * Este test demuestra que no se puede pagar una venta ya pagada.
	 * @throws VentasException
	 */
	@Test(expected = VentasException.class)
	public void cobrarTest() throws VentasException{
		this.getSut().cobrarProductos();
	}

	/**
	 * este test demuestra que no existia una oferta y que no se aplico de forma
	 * efectiva al monto que debe pagar el cliente. 
	 */
	@Override
	@Test
	public void montoAPagarSinDescuentoTest() {
	assertEquals(0, this.getSut().montoAPagarPorLosProductos(), 0.002);
	}
	
	/**
	 * Este test nunca fallara debido a que nunca no
	 * se podra realizar una compra con envio ya abonado.
	 */
	@Test
	public void noSepudoRealizarCompraTest() throws VentasException {

	}
	
	/**
	 * Este test nunca fallara debido a que nunca no se 
	 * podrar cumplir con los requisitos para realizar
	 * compras ya abonadas.
	 */
	@Override
	@Test
	public void noSeCumplenLosRequisitosParaRealizarLaCompraNoAlcanzaTest()
			throws VentaYaAbonadaException {
		
	}
	
	/**
	 * este test demuetras que es es una venta con envio
	 * a domicilio.
	 */
	@Override
	@Test
	public void ventaConEnvioTest() throws VentasException{
		assertEquals(true,this.getSut().soyUnaVentaConEnvio());
	}
	
	/**
	 * este test demuetra que los productos fueron comprasdos.
	 */
	@Test
	public void seRealizoConExitoTest() throws VentasException{
		this.getSut().realizarCompra();
		assertEquals(true,this.getSut().seRealizoConExito());
	}
	
	/**
	 * este test demuestra que dado una devolucion del envio
	 * los productos van a ser devueltos al stock de la sucursal.
	 */
	@Test
	public void seDevolvieronProductosTest(){
		VentaConEnvioYaPagado venta= (VentaConEnvioYaPagado) this.getSut();
		venta.devolverProductos();
		verify(this.getSucursalDeLACompra()).agregarStockAlStockDeSucursal(
				any(Stock.class));
		
	}
	
	/**
	 * Este test demuestra que no se a podido crear una venta 
	 * con envio pagadado ya que ya era una venta con envio
	 * pagado.
	 * @throws VentasException
	 */
	@Override
	@Test(expected = VentasException.class)
	public void ventaTransformadaTest() throws VentasException{
		this.getSut().realizarCompra();
		this.getSut().enviarVentaRealizada().soyUnaVentaConEnvio();
		
	}
	
}